package test;

import org.apache.commons.lang3.StringUtils;

import java.util.*;
import java.util.stream.Collectors;

public class Demo {


    public static void main(String[] args) {
        List<String> paramList = new ArrayList<>();

        paramList.add("me");
        paramList.add("time");
        paramList.add("bell");
        paramList.add("lo");
        paramList.add("hello");

        System.out.println(encordingStrs(paramList));


//        paramList.add("ok");

//        S=me#time#bell#hello#ok#
//        A=[0, 3, 8, 13, 16, 19]

        StringBuilder strS = new StringBuilder();
        strS.append("S");
        strS.append("=");

        List<Integer> list = new ArrayList<>();
        StringBuilder strA = new StringBuilder();
        strA.append("A");
        strA.append("=");

        for (int i = 0; i < paramList.size(); i++) {

            if (strS.toString().equals("S=")) {
                list.add(0);
            } else if (strS.indexOf(paramList.get(i)) == -1) {
                list.add(strS.length() - 2);
            }
            if (strS.indexOf(paramList.get(i)) != -1) {
                list.add(strS.indexOf(paramList.get(i)) - 2);
                continue;
            }
            strS.append(paramList.get(i));
            strS.append("#");
        }

        strA.append(list);
        System.out.println(strS.toString());
        System.out.println(strA.toString());
    }

    /**
     * 给定一个单词列表，我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。
     * 例如，如果这个列表是 ["time", "me", "bell"]，我们就可以将其表示为
     * S = "time#bell#" 和 A = [0, 2, 5]。对于每一个索引，我们可以通过从字符串
     * S 中索引的位置开始读取字符串，直到 "#" 结束，来恢复我们之前的单词列表。
     * 那么对给定单词列表，输出进行编码后的最短长度的字符串 S 和 列表 A。
     *
     * @param paramList
     * @return
     */
    public static Map<String, Object> encordingStrs(List<String> paramList) {
        Map<String, Object> retMap = new HashMap<>();
        int size = paramList.size();
        int[] a = new int[size];
        StringBuilder retString = new StringBuilder();
        for (int i = 0; i < size; i++) {
            String curretStr = paramList.get(i) + "#";
            if ("#".equals(curretStr)) {
                continue;
            }
            String longestStr = "";
            for (int j = 0; j < size; j++) {
                if (i == j) {
                    continue;
                }
                String innerCurretStr = paramList.get(j) + "#";
                if ("#".equals(innerCurretStr)) {
                    continue;
                }
                if (innerCurretStr.contains(curretStr)
                        && longestStr.length() < innerCurretStr.length()) {
                    longestStr = innerCurretStr;
                }
            }
            if (StringUtils.isEmpty(longestStr)) {
                retString.append(curretStr);
            }
        }

        String result = retString.toString();
        for (int i = 0; i < size; i++) {
            String current = paramList.get(i);
            if (StringUtils.isEmpty(current)) {
                continue;
            }
            int index = result.indexOf(current + "#");
            a[i] = index;
        }
        retMap.put("S", result);
        retMap.put("A", a);
        return retMap;
    }

}
